package com.cskaoyan.javase.oop3._2inner._4local._4life;

import javafx.geometry.VPos;

/**
 * 局部内部类对象和方法的局部变量生命周期的冲突
 *
 * 因为对象完全可能比方法中的局部变量活得更久
 * 如果对象的成员方法访问了方法的局部变量
 * 那么方法调用结束,又去哪里找这个局部变量呢?
 *
 * 为了解决这种对象和方法局部变量的生命周期的冲突
 * JVM会在创建"访问了局部变量"的局部内部类对象时,"偷偷"的把这个局部变量当成对象的成员变量,在对象中创建
 *
 * 也就是说
 * 从代码中看起来访问的是局部变量
 * 但实际上访问的是自身局部内部类对象的成员变量
 * 这样就解决了生命周期的问题
 *
 * 那么这又和局部常量有什么关系呢?
 * 关系很大
 *
 * 问题在于:
 * 从代码中看起来访问的是局部变量
 * 但实际上访问的是自身局部内部类对象的成员变量
 *
 * 如果代码中允许在局部内部类中修改局部变量,实际上修改的是成员变量
 *      但代码上看起来修改的是局部变量
 *      为了让代码看起来逻辑正确,必须将成员变量的修改,同步到局部变量的修改
 *      总之,Java开发者没有采取同步的做法,而是直接将这个局部变量设置为局部常量
 *          既然都改不了,那就不需要同步了!
 *
 * @since 15:44
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        IA ia = EncloseClazz.method();
        ia.test();
    }
}

class EncloseClazz {
    public static IA method() {
        int a = 10;
        class Inner implements IA {
            @Override
            public void test() {
                System.out.println(a);
            }
        }
        return new Inner();
    }
}

interface IA {
    void test();
}